package com.noname.lib_base_java.util;

import android.text.InputFilter;
import android.text.Spanned;
import android.text.TextUtils;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * Author: Lmoumou
 * Date: 2018-09-17 16:07
 * 文件名: EditInputFilter
 * 描述:用于过滤输入
 */
public class EditInputFilter implements InputFilter {

    /**
     * 小数点后的位数
     */
    public static final int POINTER_LENGTH = 2;

    public static final String POINTER = ".";

    Pattern p;

    public EditInputFilter() {
        p = Pattern.compile("([0-9]|\\.)*");
    }

    @Override
    public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {

        String sourceText = source.toString();
        String destText = dest.toString();

        //验证删除等按键
        if (TextUtils.isEmpty(source)) {
            if (dstart == 0 && destText.indexOf(POINTER) == 1) {//小数点不能在第一位
                return "0";
            }
            return "";
        }

        Matcher matcher = p.matcher(source);
        //已经输入过小数点的情况下，自能输入数字
        if (destText.contains(POINTER)) {
            if (!matcher.matches()) {
                return "";
            } else {
                if (POINTER.equals(source)) {//只能输入一个小数点
                    return "";
                }
            }

            //验证小数点精度，保证小数点后面只有两位
            int index = destText.indexOf(POINTER);
            int length = destText.trim().length() - index;
            if (length > POINTER_LENGTH && dstart > index) {
                return "";
            }
        } else {
            //没有小数点，只能输入小数点和数字，但首位不能输入小数点
            if (!matcher.matches()) {
                return "";
            } else {
                if ((POINTER.contentEquals(source)) && dstart == 0) {//首位是小数点的情况
                    return "0.";
                } else if ("0".contentEquals(source) && dstart == 0) {
                    //修复输入多位0
                    return "0.";
                }
            }
        }
        return null;
    }
}
